/**
 * 格式刷，只格式inline的
 * @file
 * @since 1.2.6.1
 */

/**
 * 格式刷
 * @command formatmatch
 * @method execCommand
 * @remind 该操作不能复制段落格式
 * @param { String } cmd 命令字符串
 * @example
 * ```javascript
 * //editor是编辑器实例
 * //获取格式刷
 * editor.execCommand( 'formatmatch' );
 * ```
 */
UE.plugins["formatmatch"] = function () {
    var me = this,
        list = [],
        img,
        flag = 0;

    me.addListener("reset", function () {
        list = [];
        flag = 0;
    });

    function addList(type, evt) {
        if (browser.webkit) {
            var target = evt.target.tagName == "IMG" ? evt.target : null;
        }

        function addFormat(range) {
            if (text) {
                range.selectNode(text);
            }
            return range.applyInlineStyle(list[list.length - 1].tagName, null, list);
        }

        me.undoManger && me.undoManger.save();

        var range = me.selection.getRange(),
            imgT = target || range.getClosedNode();
        if (img && imgT && imgT.tagName == "IMG") {
            //trace:964

            imgT.style.cssText +=
                ";float:" +
                (img.style.cssFloat || img.style.styleFloat || "none") +
                ";display:" +
                (img.style.display || "inline");

            img = null;
        } else {
            if (!img) {
                var collapsed = range.collapsed;
                if (collapsed) {
                    var text = me.document.createTextNode("match");
                    range.insertNode(text).select();
                }
                me.__hasEnterExecCommand = true;
                //不能把block上的属性干掉
                //trace:1553
                var removeFormatAttributes = me.options.removeFormatAttributes;
                me.options.removeFormatAttributes = "";
                me.execCommand("removeformat");
                me.options.removeFormatAttributes = removeFormatAttributes;
                me.__hasEnterExecCommand = false;
                //trace:969
                range = me.selection.getRange();
                if (list.length) {
                    addFormat(range);
                }
                if (text) {
                    range.setStartBefore(text).collapse(true);
                }
                range.select();
                text && domUtils.remove(text);
            }
        }

        me.undoManger && me.undoManger.save();
        me.removeListener("mouseup", addList);
        flag = 0;
    }

    me.commands["formatmatch"] = {
        execCommand: function (cmdName) {
            if (flag) {
                flag = 0;
                list = [];
                me.removeListener("mouseup", addList);
                return;
            }

            var range = me.selection.getRange();
            img = range.getClosedNode();
            if (!img || img.tagName != "IMG") {
                range.collapse(true).shrinkBoundary();
                var start = range.startContainer;
                list = domUtils.findParents(start, true, function (node) {
                    return !domUtils.isBlockElm(node) && node.nodeType == 1;
                });
                //a不能加入格式刷, 并且克隆节点
                for (var i = 0, ci; (ci = list[i]); i++) {
                    if (ci.tagName == "A") {
                        list.splice(i, 1);
                        break;
                    }
                }
            }

            me.addListener("mouseup", addList);
            flag = 1;
        },
        queryCommandState: function () {
            return flag;
        },
        notNeedUndo: 1
    };
};
